#include using namespace std; typedef long long int uli; int rint(char f){ char ch=getchar(); int sgn=1; int v=0; if(ch=='-')sgn=-1; else{ assert('0'<=ch && ch<='9'); v=ch-'0'; } while(true){ char ch=getchar(); if(ch==f)break; assert('0'<=ch && ch<='9'); v=v*10+ch-'0'; } return v*sgn; } const int mx=1e5+10; int a[mx]; const int mxl=20; vectorg[mx]; vectorw[mx]; int rmq[mxl][mx+mx]; int fst[mx],lst[mx]; int lyr[mx]; uli dep[mx]; bool hidden[mx]; vectoreul; void dfs(int u,int pu){ eul.push_back(u); for(int i=0;ilst[v])swap(u,v); int from=lst[u]; int to=fst[v]; if(from>to)to=lst[v]; return minimo(from,to); } struct diameter{ int t[2]; uli l; bool operator <(diameter d)const{ return ldivs[mxa]; vector >nodes[mxa]; int main(){ for(int i=1;i >()); for(auto au:nodes[g]){ int u=au.second; p[u]=u; diam[u]={{u,u},0}; hidden[u]=true; } for(auto au:nodes[g]){ uli mini=au.first; int u=au.second; for(int v: ::g[u])if(a[v]%g==0 && !hidden[v]){ int pu=gp(u); int pv=gp(v); if(pu==pv)continue; auto d=join(diam[pu],diam[pv]); p[pv]=pu; diam[pu]=d; uli bet=d.l*mini*g; ans=max(ans,bet); } hidden[u]=false; } } printf("%lld\n",ans); } assert(getchar()==EOF); return 0; }